#include<bits/stdc++.h>
using namespace std;

class Solution {
public:
    vector<int> luckyNumbers (vector<vector<int>>& matrix) {
        unordered_set<int>st;
        vector<int>ans;
        vector<int>column_max(matrix[0]);
        for(int i = 0; i < matrix.size(); i++){
            int row_min = 1000000;
            for(int j = 0; j < matrix[i].size(); j++){
                if(matrix[i][j] < row_min)row_min = matrix[i][j];
                column_max[j] = max(column_max[j], matrix[i][j]);
            }
            st.emplace(row_min);
        }
        for(int i = 0; i < column_max.size(); i++){
            if(st.count(column_max[i]))ans.emplace_back(column_max[i]);
        }
        return ans;
    }
};

/**
 * @brief 2022.2.15
 * 利用所有数各不相同，在找每行最小的数的同时，更新每列最大的数
 * 最后找最小的数和最大的数中的交集返回即可
 */